package com.sun.stockexchangesimulate.simulate;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sun.stockexchangesimulate.domain.StockPrice;
import com.sun.stockexchangesimulate.mapper.StockPriceMapper;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Random;

/**
 * @author sun
 * <p>
 * 模拟时间
 * <p>
 * 假定开始时间为11.11零点
 * <p>
 * 1、获取当前时间
 * <p>
 * 返回date类型
 * <p>
 * 返回datetime类型 （返回该时间到下个时间中的一个随机时间，模拟不同投资者投资的先后随机，否则程序中一定是，一号投资者在相同价位下优先匹配）
 * <p>
 * 返回time类型
 * <p>
 * <p>
 * <p>
 * 2、时间推进
 * <p>
 * 以半个小时推进  从早上九点推进到下午3点半
 * <p>
 * 以天推进，从第一天下午三点半推进到第二天上午九点开启新一轮投票
 */

@Service
public class TimeSimulator {
    private LocalDateTime currentTime;
    private final Random random;

    @Autowired
    private StockPriceMapper stockPriceMapper;

    public TimeSimulator() {

        this.random = new Random();
    }

    @PostConstruct
    public void init() {
        // 假定开始时间为数据库中时间的下一天9点
        LocalDate localDate = stockPriceMapper.selectOne(new LambdaQueryWrapper<StockPrice>().orderByDesc(StockPrice::getDate).last("LIMIT 1")).getDate();
        this.currentTime = localDate.plusDays(1).atTime(9, 0);
    }

    // 获取当前时间，返回Date类型
    public Date getCurrentDate() {
        return Date.from(currentTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    // 获取当前时间，返回DateTime类型
    public LocalDateTime getCurrentLocalDateTime() {
        return currentTime;
    }
    // 返回该时间到下个时间中的一个随机时间
    public LocalDateTime getRandomCurrentDateTime() {
        return currentTime.plusMinutes(random.nextInt(30));
    }


    // 获取当前时间，返回Time类型
    public LocalTime getCurrentTime() {
        return currentTime.toLocalTime();
    }
    // 获取当前时间，返回LocalDate类型
    public LocalDate getCurrentLocalDate() {
        return currentTime.toLocalDate();
    }


    // 时间推进，以半个小时推进，从早上九点推进到下午3点半
    public void advanceByHalfHour() {
        if (currentTime.getHour() < 9) {
            currentTime = LocalDateTime.of(currentTime.toLocalDate(), LocalTime.of(9, 0));
        } else if (currentTime.getHour() < 15 || (currentTime.getHour() == 15 && currentTime.getMinute() < 30)) {
            currentTime = currentTime.plusMinutes(30);
        }
    }

    // 时间推进，以天推进，从第一天下午三点半推进到第二天上午九点开启新一轮投票
    public void advanceByDay() {

        currentTime = currentTime.plusDays(1).withHour(9).withMinute(0).withSecond(0).withNano(0);

    }

    public static void main(String[] args) {
        TimeSimulator simulator = new TimeSimulator();

        // 示例：获取当前时间
        System.out.println("当前日期: " + simulator.getCurrentDate());
        System.out.println("当前日期时间: " + simulator.getRandomCurrentDateTime());
        System.out.println("当前时间: " + simulator.getCurrentTime());

        // 示例：时间推进
        for (int i = 0; i < 10; i++) {
            simulator.advanceByHalfHour();
            System.out.println("推进后的时间: " + simulator.getRandomCurrentDateTime());
        }

        simulator.advanceByDay();
        System.out.println("推进一天后的时间: " + simulator.getRandomCurrentDateTime());
    }
}
